import os
import argparse
from core.deploy import MiniCPMVDeploy
from inference.video_inference import VideoInferencer
from utils.batch_processor import process_directory


def main():
    """
    批量视频推理主函数
    """
    print("===== MiniCPM-V 批量视频推理工具 ======")
    print("基于模块化架构的批量视频处理")
    print("====================================")
    
    # 设置默认视频目录为项目中的videos文件夹
    default_video_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'videos')
    
    # 先初始化deploy获取配置文件中的默认值
    temp_deploy = MiniCPMVDeploy()
    batch_config = temp_deploy.config.get('batch_processing', {}).get('video', {})
    config_default_video_dir = temp_deploy.config.get('paths', {}).get('default_video_dir', default_video_dir)
    
    # 使用配置文件中的目录（如果有）覆盖默认目录
    if config_default_video_dir != 'videos':  # 避免使用默认字符串
        default_video_dir = config_default_video_dir
    
    # 解析命令行参数，使用配置文件中的值作为默认值
    parser = argparse.ArgumentParser(description='MiniCPM-V 批量视频推理工具')
    parser.add_argument('--video_dir', type=str, default=None,
                        help=f'视频文件夹路径，默认为配置文件中的值: {default_video_dir}')
    parser.add_argument('--prompt', type=str, default=None,
                        help=f'提示词模板，支持{{file_name}}变量，默认为配置文件中的值')
    parser.add_argument('--output_dir', type=str, default=None,
                        help='输出结果目录，默认为配置文件中的output_dir')
    parser.add_argument('--export_csv', type=str, default=None,
                        help=f'导出CSV文件路径，默认为配置文件中的值: {batch_config.get("export_csv", "null")}')
    parser.add_argument('--max_workers', type=int, default=None,
                        help=f'最大工作线程数，默认根据GPU内存自动计算或使用配置文件中的值: {batch_config.get("max_workers", "auto")}')
    parser.add_argument('--recursive', action='store_true',
                        help=f'是否递归搜索子目录，默认为配置文件中的值: {batch_config.get("recursive", False)}')
    parser.add_argument('--no_save', action='store_true',
                        help=f'不保存单个结果文件，默认为配置文件中的值: {not batch_config.get("save_individual_results", True)}')
    
    args = parser.parse_args()
    
    # 确定最终使用的配置（命令行参数优先于配置文件）
    video_dir = args.video_dir or default_video_dir
    # 从命令行参数或配置文件获取提示词，设置合理的默认值
    default_prompt = batch_config.get('prompt', '请详细描述这个视频的内容')
    prompt = args.prompt or default_prompt
    export_csv = args.export_csv or batch_config.get('export_csv')
    max_workers = args.max_workers or batch_config.get('max_workers')
    recursive = args.recursive or batch_config.get('recursive', False)
    save_result = not args.no_save and batch_config.get('save_individual_results', True)
    
    # 如果没有提供视频目录，提示用户输入
    if not video_dir:
        print("请输入视频文件夹路径: ")
        video_dir = input().strip()
        if not video_dir:
            print("未提供视频文件夹路径，程序退出")
            return
    
    # 检查目录是否存在
    if not os.path.exists(video_dir):
        print(f"错误: 目录不存在: {video_dir}")
        return
    
    # 如果没有提供提示词，使用配置文件中的默认值
    if not args.prompt:
        print(f"请输入提示词模板（留空使用默认模板: '{prompt}'）: ")
        user_input = input().strip()
        if user_input:
            prompt = user_input
    
    # 显示参数信息
    print("\n===== 批量推理参数 =====")
    print(f"视频目录: {video_dir}")
    print(f"提示词模板: {prompt}")
    print(f"是否递归搜索: {recursive}")
    if max_workers is not None:
        print(f"最大工作线程数: {max_workers}")
    if export_csv:
        print(f"CSV导出路径: {export_csv}")
    print(f"是否保存单个结果文件: {save_result}")
    print("====================")
    
    # 初始化部署类（只初始化一次）
    deploy = MiniCPMVDeploy()
    
    # 更新输出目录配置（如果提供）
    if args.output_dir:
        deploy.update_config({"paths": {"output_dir": args.output_dir}})
    
    # 确保模型目录配置正确（这是解决模型不完整问题的关键）
    model_dir = deploy.config.get('model', {}).get('local_model_path')
    if model_dir:
        print(f"使用模型目录: {model_dir}")
    else:
        print("警告: 未找到本地模型目录配置，将使用默认模型路径")
    
    # 开始批量处理
    process_directory(
        dir_path=video_dir,
        inferencer_class=VideoInferencer,
        prompt=prompt,
        save_result=save_result,
        export_csv=export_csv,
        max_workers=max_workers,
        recursive=recursive,
        deploy=deploy
    )
    
    # 卸载模型，释放内存
    deploy.unload_model()
    
    print("\n===== 批量视频推理完成 ======")
    print("感谢使用MiniCPM-V批量视频推理工具！")


if __name__ == "__main__":
    main()